package com.bt7274.service;

import com.bt7274.pojo.UserExp;
import com.bt7274.pojo.vo.UserExpVO;

/*
 * 用户经验服务接口
 */
public interface UserExpService {
    /**
     * 初始化用户体验数据
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean initUserExp(String userId);

    /**
     * 更新用户上传下载量
     *
     * @param userId 用户ID
     * @param uploadedDelta 上传量增量
     * @param downloadedDelta 下载量增量
     * @return 是否成功
     */
    boolean updateUploadDownload(String userId, Long uploadedDelta, Long downloadedDelta);

    /**
     * 更新用户经验值
     *
     * @param userId 用户ID
     * @param experienceDelta 经验值增量
     * @return 是否成功
     */
    boolean updateExperience(String userId, Integer experienceDelta);

    /**
     * 更新用户BT币
     *
     * @param userId 用户ID
     * @param btDelta BT币增量（可为负数）
     * @return 是否成功
     */
    boolean updateBt(String userId, Integer btDelta);

    /**
     * 检查用户BT币是否足够
     *
     * @param userId 用户ID
     * @param amount 需要的BT币数量
     * @return 是否足够
     */
    boolean hasSufficientBt(String userId, Integer amount);

    /**
     * 重新计算用户分享率
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean recalculateRatio(String userId);

    /**
     * 根据经验值计算应有的权限组
     *
     * @param experience 经验值
     * @return 权限组等级
     */
    Integer calculatePermissionGroup(Integer experience);

    /**
     * 自动升级用户等级
     *
     * @param userId 用户ID
     * @return 是否升级
     */
    boolean autoUpgradeUserLevel(String userId);

    /**
     * 获取用户体验数据
     *
     * @param userId 用户ID
     * @return 用户体验数据
     */
    UserExp getUserExp(String userId);

    /**
     * 用户发种奖励
     *
     * @param userId 用户ID
     * @param torrentSize 种子大小（字节）
     * @return 是否成功
     */
    boolean rewardForSeed(String userId, Long torrentSize);

    /**
     * 用户保种奖励
     *
     * @param userId 用户ID
     * @param torrentSize 种子大小（字节）
     * @param seedingHours 保种小时数
     * @return 是否成功
     */
    boolean rewardForSeeding(String userId, Long torrentSize, Integer seedingHours);

    UserExp createOrUpdate(UserExp userExp);

    int calculateDownloadCost(Long torrentSize);
//
//    /**
//     * 获取用户不活跃天数
//     * @param userId 用户ID
//     * @return 不活跃天数
//     */
//    Integer getInactiveDays(String userId);
//
//    /**
//     * 更新用户经验值
//     * @param userId 用户ID
//     * @param expChange 经验值变化量（正数增加，负数减少）
//     * @return 是否更新成功
//     */
//    boolean updateExp(String userId, int expChange);
}
